// ES
// let obj = {};
// let newVal
// Object.defineProperties(obj, 'name', {
//   get() {
//     console.log('set');
//   },
//   set(val) {
//     console.log(set);
//     newVal = val
//   }
// })


//proxy methods
// let obj = {}
// let p = new Proxy(obj, {})
// p.name = 'yyy'
// console.log(obj.name); // p 已经对obj成功代理



// let arr = [7, 8, 9]
// arr = new Proxy(arr, {
//   get(target, prop) {
//     console.log(target, prop);
//     return prop in target ? target[prop] : 'error'
//   }
// }) 
// console.log(arr[1]); 

// let dict = {
//   'hello': '你好',
//   'world': '世界'
// }
// dict = new Proxy(dict, {
//   get(target, prop) {
//     prop in target ? target[prop] : prop 
//   }
// })


// // set
// let arr = []
// arr - new Proxy(arr, {
//   set(target, prop, val) {
//     if (typeof val === 'number') {
//       target[prop] = val
//       return true
//     } else {
//       return false
//     }
//   }
// })
// arr.push(5.5)
// console.log(arr[0]); // proxy代理了对象,但是自身的方法还是可以用的


// // has
// let range = {
//   start: 1, 
//   end: 5
// }

// range = new Proxy(range, {
//   has(target, prop) { 
//     prop >= target.start && prop <= target.end 
//   }
// })
// console.log( 2 in range );
// console.log(9 in range );

// // ownKeys
// let obj = {
//   name: 'imooc', 
//   [Symbol('es')]: 'es6'
// }

// console.log(Object.getOwnPropertyNames(obj));
// console.log(Object.getOwnPropertySymbols(obj));
// console.log(Object.keys(obj));//对当前对象的属性进行拦截
// for(let key in obj) {
//   console.log(key); // 只有name属性,没symbol
// }

// let userinfo = {
//   username: 'yk',
//   age: 25, 
//   _password: '***'
// }
// userinfo = new Proxy(userinfo, {
//   ownKeys(target) {
//     return Object.keys(target).filter(key => !key.startsWith('_'))
//   }
// })

// let user = {
//   name: 'yk', 
//   age: 25, 
//   _password: '***'
// }
// user = new Proxy(user, {
//   get(target, prop) {
//     if(prop.startsWith('_')) {
//       throw new Error('不可访问')
//     }else {
//       return target[prop]
//     }
//   },
//   set(tarrget, prop, val) {
//     if(prop.startsWith('_')) {
//       throw new Error('不可访问')
//     }else {
//       target[prop] = value
//       return true
//     }
//   },
//   deleteProperty() {
//     if(prop.startsWith('_')) {
//       throw new Error('不可删除')
//     }else {
//       delete target[prop]
//       return true
//     }
//   },
//   ownKeys(target) {
//     return Object.keys(target).filter(key => !key.startsWith('_'))
//   }
// })
// console.log(user.age);
// console.log(user._password);

// user.age = 19;



// try {
//   user._password = '***'
// } catch (error) {
//   console.log(e.message);
// }

// apply
let sum = (...args) =>{
  let sum = 0
  args.forEach(item => {
    num += item
  })
  return num
}

sum = new Proxy(sum, {
  apply(target, ctx, args) { // 对应目标, 上下文, 数组
    return target(...args) * 2
  }
})


// construct new
let User = class {
  constructor(name) {
    this.name = name 
  }
}
User = new Proxy(User, {
  construct(target, args, newTarget) {
    return new target(...args)
  }
})